/*
 * Copyright (c) 2012 Mikaël GUILLEMOT
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package org.g2de.tools;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

/**
 * 
 * classe de dictionnaire : permet de gerer les chaines de message pour une
 * internationnalisation de base
 * 
 * Permet d'eviter de passer par le bundle, pour laisser le choix de la langue a
 * l'utilisateur. L'objectif n'est pas de gerer du chinois... Au pire cette
 * classe peut etre repensé pour une intrenationnalisation plus large.
 * 
 * FIXME le probleme de cette techinque est que l'utf8 est pas pris en charge.
 * seul l'iso-8859-1 l'est !!
 * 
 * @author Mikael GUILLEMOT
 * @version 0.1 (draft)
 * @since
 * 
 * 
 * 
 */
public class Dico {
	private static Dico instance = null;
	private Properties dico = null;
	private static boolean loaded = false;
	private Tools t;

	private final String PARAM = "LOLZ";

	// private static ResourceBundle rb;
	// rb= PropertyResourceBundle.getBundle("");
	// http://www.roseindia.net/java/example/java/swing/internationalization.shtml

	/**
	 * methode pour recuperer l'instance de la classe
	 */
	public final synchronized static Dico getInstance() {
		if (instance == null) {
			instance = new Dico();
		}
		return instance;
	}

	// charge le dictionnaire
	private Dico() {
		t = Tools.getInstance();
		dico = new Properties();
		try {
			FileInputStream file = new FileInputStream(t.getStringFor("DICTIONARY_PATH"));

			dico.load(file);
			file.close();
			loaded = true;
		} catch (IOException e) {
			t.logError("Can't find (or open) \"" + t.getStringFor("DICTIONARY_PATH") + "\"");
			System.exit(ExitCode.DICO_ERROR);
		}
	}

	/**
	 * renvoi la chaine correspondante a la clef passé en paramettre, c'est le
	 * fichier correspondant a la clef DICTIONARY_PATH du fichier de
	 * configuration principal qui est renvoyé.
	 * 
	 * @param key
	 * @return
	 */
	public final String get(String key) {
		if (loaded)
			return dico.getProperty(key);
		else
			return key;
	}

	/**
	 * methode de commoditée pour afficher un message du dico en passant par le
	 * loggeur
	 * 
	 * @param key
	 */
	public final void log(String key) {
		t.log(this.get(key));
	}

	/**
	 * permet de construire une chaine en y inserant des variables (noms,
	 * valeurs, etc...) line est la ligne de base contenant la valeur LOLZ la ou
	 * les paramettres doivent etre inséré.
	 * 
	 * @param line
	 * @param param
	 * @return
	 */
	public String get(String line, String... param) {
		String[] fragments = line.split(PARAM);
		StringBuilder result = new StringBuilder();
		for (int i = 0; i < fragments.length; i++) {
			result.append(fragments[i]);
			if (param.length > i)
				result.append(param[i]);
		}
		return result.toString();
	}

	/**
	 * methode de commoditée pour afficher un message du dico (avec parametres)
	 * en passant par le loggeur
	 * 
	 * @param key
	 */
	public final void log(String key, String... param) {
		t.log(this.get(this.get(key), param));
	}

}
